<!--
 * @Author: Wushiqi
 * @Descripttion: 函数柯里化
 * @Date: 2021-05-07 10:30:52
 * @LastEditor: Wushiqi
 * @LastEditTime: 2021-05-07 11:35:38
-->
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    function add() {
      // 第一次执行时，定义一个数组专门用来存储所有的参数
      const args = Array.prototype.slice.call(arguments)
      
      // 在内部声明一个函数，利用闭包的特性保存args并收集所有的参数值
      const adder = function() {
        args.push(...arguments)
        return adder
      }

      // 利用toString隐式转换的特性，当最后执行时隐式转换，并计算最终的值返回
      adder.toString = function() {
        return args.reduce((prev, curr) => {
          return prev + curr
        }, 0)
      }
      return adder
    }
    console.log(add(1, 2, 4))
    console.log(add(1)(2)(3))

    // 计算所有参数组成的数组
    function toArr() {
      const args = Array.prototype.slice.call(arguments)

      const arr = function() {
        args.push(...arguments)
        return arr
      }
      arr.toString = function() {
        return args.reduce((pre, next) => {
          return pre*next
        })
      }
      return arr
    }
    console.log(toArr(1, 2, 3)); // 6
    console.log(toArr(1)(3)(4)); // 12
  </script>
</body>
</html>